package com.reflection1;

import javax.xml.bind.annotation.DomHandler;

/**
 * @description:
 * @author: jhy
 * @time: 2021/4/24 13:46
 */

//获得Class类对象的4种方式
public class ClassTest {

    public static void main(String[] args) throws ClassNotFoundException {

        //1.通过Class.forName(类的全限定类名)获得Class类对象
        Class cls1 = Class.forName("com.reflection1.Dog");

        //2.通过类名.class获得Class类对象
        Class<Dog> cls2 = Dog.class;

        //3.通过实例对象.getClass()获取Class类对象
        Class<? extends Dog> cls3 = new Dog().getClass();

        //4.通过类加载器获得Class类对象
        ClassLoader classLoader = new Dog().getClass().getClassLoader();
        Class<?> cls4 = classLoader.loadClass("com.reflection1.Dog");

        //因为类加载只发生一次，并且每个Class字节码在堆中对应的Class对象都是唯一的
        //cl1 、 cl2 、 cls3 、 cls4均是同一个Class对象
        System.out.println(cls1.hashCode());
        System.out.println(cls2.hashCode());
        System.out.println(cls3.hashCode());
        System.out.println(cls4.hashCode());

        //基本数据类型及其包装类获得Class类对象
        Class<Integer> integerClass = int.class;

        Class<Integer> integerClass1 = Integer.TYPE;
        System.out.println(integerClass == integerClass1);

    }
}
